﻿using System;
using System.Collections.Generic;
using System.Text;
using RC.ControlAcceso.BaseDatos;
using System.Data;
using RC.CodigoBarras.Utiles;
using System.Web.Caching;
using RC.ControlAcceso.BaseDatos.GestionHorariaTableAdapters;

namespace RC.ControlAcceso.ObjetosNegocio
{
    public class CA2RazonSocial
    {
        #region CACHE
        private static Cache _cache;
        /// <summary>
        /// Cache para todos los objetos de legajo
        /// </summary>
        private static Cache CacheCA
        {
            get
            {
                if (_cache == null)
                    _cache = System.Web.HttpRuntime.Cache;
                return _cache;
            }
            set
            {
                _cache = value;
            }
        }
        #endregion

        #region Variables
        private int _ID;
        private string _nombre;
        private bool _estaActiva;
        #endregion

        #region Propiedades

        public int ID
        {
            get { return _ID; }
            set { _ID = value; }
        }
        public string Nombre
        {
            get { return _nombre; }
            set { _nombre = value; }
        }
        public bool EstaActiva
        {
            get { return _estaActiva; }
            set { _estaActiva = value; }
        }
        #endregion

        #region Constructores
        public CA2RazonSocial()
        {
            ID = -1;
            Nombre = "";
            EstaActiva = true;
        }
        #endregion

        

        #region Interfase DAL
        //objeto de la capa DAL
        private static RazonSocialTableAdapter _RazonSocialAD;
        protected static RazonSocialTableAdapter Adaptador
        {
            get
            {
                if (_RazonSocialAD == null)
                    _RazonSocialAD = new RazonSocialTableAdapter();

                return _RazonSocialAD;
            }
        }
        public static CA2RazonSocial ObtenerPorID(int pIDidRazonSocial)
        {
            /////////////////////////
            // Obtengo objeto desde el cache
            CA2RazonSocial _RazonSocial = (CA2RazonSocial)CacheCA["RazonSocial" + pIDidRazonSocial.ToString()]; // trato de obtenerlo del cache
            if (_RazonSocial != null)
                return _RazonSocial;
            // Fin obtener de cache
            ///////////////////////////////////

            ///////////////////////////////////////////////
            // No esta en el cache lo tengo que traer de la base de datos
            GestionHoraria.RazonSocialDataTable _dt;

            // obtengo el elemento por ID            
            _dt = Adaptador.ObtenerPorId(pIDidRazonSocial);

            // si tiene algo,
            if (_dt.Rows.Count > 0)
            {
                _RazonSocial = AsignarRowAObjeto((GestionHoraria.RazonSocialRow)_dt.Rows[0]);

                // Asigno el nuevo objeto al cache.
                CacheCA.Insert("RazonSocial" + _RazonSocial.ID.ToString(), _RazonSocial, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(1, 0, 0));
            }

            return _RazonSocial;
        }
        protected static CA2RazonSocial AsignarRowAObjeto(GestionHoraria.RazonSocialRow pRow)
        {
            CA2RazonSocial _RazonSocial = null;
            if (pRow != null)
            {
                _RazonSocial = new CA2RazonSocial();
                _RazonSocial.ID = pRow.ID;
                try { _RazonSocial.Nombre = pRow.Nombre; }
                catch { _RazonSocial.Nombre = ""; }
                try { _RazonSocial.EstaActiva = pRow.EstaActiva; }
                catch { _RazonSocial.EstaActiva = true; }
            }
            return _RazonSocial;
        }
        public static int Insertar(string pNombre, bool pEstaActiva)
        {
            return int.Parse(Adaptador.Insertar(pNombre, pEstaActiva).ToString());
        }
        public static bool Actualizar(string pNombre, bool pEstaActiva, int pID)
        {
            if (0 < Adaptador.Actualizar(pNombre, pEstaActiva, pID))
            {
                //Quito el objeto del cache para que no se tome otra vez con los datos viejos.
                CacheCA.Remove("RazonSocial" + pID.ToString());
                return true;
            }
            else
                return false;
        }
        protected static CA2RazonSocialColeccion AsignarRazonSocialTableAdapterARazonSocialColeccion(GestionHoraria.RazonSocialDataTable pDataTable)
        {
            CA2RazonSocialColeccion _RazonSocials = new CA2RazonSocialColeccion();
            CA2RazonSocial _RazonSocial;

            if ((pDataTable != null)
                && (pDataTable.Rows.Count > 0))
            {
                foreach (GestionHoraria.RazonSocialRow _row in pDataTable.Rows)
                {
                    _RazonSocial = AsignarRowAObjeto(_row);
                    if (_RazonSocial != null)
                        _RazonSocials.Add(_RazonSocial);
                }
            }
            return _RazonSocials;
        }
        public static CA2RazonSocialColeccion ObtenerTodos()
        {
            return AsignarRazonSocialTableAdapterARazonSocialColeccion(Adaptador.ObtenerTodos());
        }

        /// <summary>
        /// Obtiene todas las RazonSocials que contengan el valor especificado.
        /// Si el parametro es "" se obtienen todas las RazonSocials
        /// </summary>
        /// <param name="pValor"></param>
        /// <returns></returns>
        public static CA2RazonSocialColeccion ObtenerPorValor(string pValor)
        {
            if ((pValor == null) // si esta vacio le devuelvo todas las RazonSocials
                || (pValor == ""))
                return AsignarRazonSocialTableAdapterARazonSocialColeccion(Adaptador.ObtenerTodos());

            return AsignarRazonSocialTableAdapterARazonSocialColeccion(Adaptador.ObtenerPorValor(pValor));
        }
        #endregion

        public static void Actualizar(CA2RazonSocial _RazonSocial)
        {
            Actualizar(_RazonSocial.Nombre, _RazonSocial.EstaActiva, _RazonSocial.ID);
        }
        public static int Insertar(CA2RazonSocial _RazonSocial)
        {
            return CA2RazonSocial.Insertar(_RazonSocial.Nombre, _RazonSocial.EstaActiva);
        }
        public static void Eliminar(CA2RazonSocial _RazonSocial)
        {
            _RazonSocial = CA2RazonSocial.ObtenerPorID(_RazonSocial.ID);
            _RazonSocial.EstaActiva= false;
            Actualizar(_RazonSocial);
        }
    }
    public class CA2RazonSocialColeccion : System.Collections.CollectionBase
    {
        public void Add(CA2RazonSocial pRazonSocial)
        {
            this.List.Add(pRazonSocial);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public CA2RazonSocial this[int index]
        {
            get { return ((CA2RazonSocial)(this.List[index])); }
            set { this.List[index] = value; }
        }
        /// <summary>
        /// Devuelve el objeto RazonSocial que corresponde al nombre especificado.
        /// Si la RazonSocial no existe, devuel Null.
        /// </summary>
        /// <param name="pNombreRazonSocial"></param>
        /// <returns></returns>
        public CA2RazonSocial ObtenerRazonSocialPorNombre(string pNombreRazonSocial)
        {
            foreach (CA2RazonSocial _RazonSocial in this)
                try
                {
                    if (_RazonSocial.Nombre.ToUpper() == pNombreRazonSocial.ToUpper())
                        return _RazonSocial;
                }
                catch { }

            // si no lo encuentra devuelve vacio
            return null;
        }
    }
}